# encoding=utf-8

import pandas as pd

import src.core.TextUtils as textutils
import src.core.tf_idf as tf_idf
import numpy as np


def convert2KeywordsDataframs(values):
    typemap = {}
    keywordmap = {}
    keywordset = set()

    index = 0;
    # 1. 相对每一行文本进行分词处理，同时记录分词后的2维数组 和 类型之间的映射关系
    for type, text in values:
        map = textutils.dict(text)
        typemap[index] = type
        keywordmap[index] = map
        keywordset = keywordset.union(map.keys())
        # print(map.keys())
        index = index + 1

    # 2. 合并所有的行的关键字，作为总的特征列名称，总计有3w多条，实在太大了
    columns = list(keywordset)
    columns.sort()
    row_datas = []
    row_types = []

    # 3. 计算每一行数据对应在所有关键字中的出现频率，如果没有出现计算为0
    for index in range(len(keywordmap)):
        # print(index)
        value_map = keywordmap.get(index)
        # print(value_map)
        row = []
        row_types.append(typemap.get(index))
        for column in columns:
            # print(column)
            if value_map.get(column):
                row.append(value_map.get(column))
            else:
                row.append(0)
        row_datas.append(row)

    # 4. 根据所有的数据和特征，使用 scklearn提供的chi函数进行降维，从 3w多行直接降低到 500
    chi_dataX = chi(pd.DataFrame(data=row_datas, columns=columns), row_types, 500)

    # 5. 使用scklearn提供的tf_dif函数对降维后的数据进行数据标准化处理，同时缓存训练过的数据转换器
    tfidf_dataX = tf_idf.tf_dif_df(chi_dataX)

    return {
        "X": tfidf_dataX,
        "y": row_types
    }


def chi(dataX, dataY, k):
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    model1 = SelectKBest(chi2, k=k)  # 选择k个最佳特征
    data = model1.fit_transform(dataX, dataY)  # iris.data是特征数据，iris.target是标签数据，该函数可以选择出k个特征

    mask = model1.get_support()
    new_features = dataX.columns[mask]

    print(new_features)

    dataframe = pd.DataFrame(data, columns=new_features)
    return dataframe


def convert2KeywordsArr(columns, transformer, text):
    value_map = textutils.dict(text)

    # columns = list(columns)
    # columns.sort()
    row_datas = []

    for column in columns:
        # print(column)
        if value_map.get(column):
            row_datas.append(value_map.get(column))
        else:
            row_datas.append(0)

    # 做TF-IDF转换
    trans_data = np.array(row_datas).reshape(1, -1)
    trans = transformer.transform(trans_data)

    arr = trans.toarray()
    return arr
